#include "base_server.cpp"

//回射服务器-服务器v1
//I/O模型采用阻塞IO，如果全局只有一个进程，万一阻塞则其他用户也无法使用
//所以采用多进程or线程的方式来规避这个问题
//采用一个客户端一个子进程server
int main(){

    int listenfd, connfd;
    pid_t childPid;
    int port = SERVER_PORT_REFLECTION_V1;
    void sig_child(int), sig_init(int), web_child(int);
    socklen_t clilen, addrlen;
    struct sockaddr *cliaddr; 

    listenfd = tcp_create_bind_listen(port);

    signal(SIGCHLD, sig_child);
    signal(SIGINT, sig_init);

    //这个for应该 是无限循环，为了测试改为了有限数量
    for(int i = 0; i < 10000; i++){
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, cliaddr, &clilen);
        if(connfd < 0){
            printf("accept error\n");
            continue;
            //error_func("accept error");
        }
        
        struct sockaddr_in *clientAddress = (struct sockaddr_in*)&cliaddr;
        int port = ntohs(clientAddress->sin_port);

        printf("来客了=>\n");

        childPid = fork();
        if(childPid == 0){
            close(listenfd);
            web_child(connfd);
            exit(0);
        }

        close(connfd);
    }

    return 0;
}

void sig_child(int signo){
    printf("sign handle SIGCHLD\n");
    wait(NULL);
}

void sig_init(int signo){
    printf("sign handle SIGINT\n");
    wait(NULL);
    sleep(1);
    exit(0);
}

void web_child(int connfd){
    // sleep(3);

    char buffer[256];
    int n=0;
    bzero(buffer, 256);
    n = read(connfd, buffer, 255);
    if(n < 0){
        error_func("read socket失败", n);
    }else if(n == 0){
        //对方关闭
        error_func("对方关闭连接", n);
    }

    printf("read()=>%s\n", buffer);

    // char sendBuff[1025] = "你好呀，连接成功";
    write(connfd, buffer, strlen(buffer));
    printf("send()=>%s\n", buffer);
}

